GlueのPython ShellでクロスアカウントのS3ファイルコピーをしてみた
Glueで別アカウントのS3ファイルって触れる?
こんにちは。DI部の大高です。
先日、Glueで別アカウントのS3ファイルを触れるのかどうかという話が開発チーム内であり、気になったので実際に試してみました。
やりたいこと
AWSのアカウントAのGlueから、アカウントBのS3バケット内のファイルを取得して、アカウントAのS3バケットにコピーしたいと思います。
想定では、単純にアカウントAのGlueジョブが利用しているロールからのアクセスを、アカウントBのS3バケットのバケットポリシーで許可してあげればよい想定です。
試してみる
まずは以下の記事を参考に、アカウントAの環境でGlue用のIAMロールやPython Shellのジョブをササっと作成します。
Glue用のIAMロールには以下のようにポリシーを設定し、ロール名はAWSGlueServiceRole-cm-ootaka.daisuke
としました。
このIAMロールをアタッチしたGlueのPython Shellのジョブを以下のようなコードで作成します。単純にサンプルファイルをコピーするだけのものです。
import boto3 source_bucket = 'account-b-bucket' source_key = 'glue/Sample.csv.gz' dist_bucket = 'account-a-bucket' dist_key = 'glue/Sample.csv.gz' s3 = boto3.client('s3') s3.copy_object(Bucket=dist_bucket, Key=dist_key, CopySource={'Bucket': source_bucket, 'Key': source_key})
次に、アカウントBのS3バケットのバケットポリシーの設定です。以下のようにバケットポリシーを設定します。アカウントAのGlueのロールに対して、アカウントBのS3バケットに対するアクションの許可を与えています。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::999999999999:role/AWSGlueServiceRole-cm-ootaka.daisuke" }, "Action": [ "s3:GetObject", "s3:PutObject", "s3:PutObjectAcl" ], "Resource": [ "arn:aws:s3:::account-b-bucket/*" ] } ] }
設定が終わったら、早速Glueのジョブを実行してみます。実行すると、特に問題なくジョブが成功し、コピー先のS3バケットにもファイルがコピーされました! 想定通り問題なくアカウントBのS3バケットにアクセスできていますね。
まとめ
以上、GlueのPython ShellでクロスアカウントのS3ファイルコピーでした。
どなたかのお役に立てれば幸いです。それでは!